#include "escenario.h"


/*------------------------------------------------------------------------------
	Constructor
------------------------------------------------------------------------------*/
CEscenario::CEscenario()
{
	m_pRecursos=NULL;
	m_pEscenario=NULL;
	m_uiNumTexturas=0;
	m_iVistaIzq=0;
	m_iVistaDer=0;
	m_bTransparente=FALSE;
	m_aColor[0]=1.0f;
	m_aColor[1]=1.0f;
	m_aColor[2]=1.0f;
}

/*------------------------------------------------------------------------------
	Destructor
------------------------------------------------------------------------------*/
CEscenario::~CEscenario()
{
}

/*------------------------------------------------------------------------------
	Initializes the object
------------------------------------------------------------------------------*/
void CEscenario::Iniciar(CRecursos *pRecursos)
{
	if(!pRecursos) 
		return;
		
	m_pRecursos=pRecursos;
	m_pEscenario=m_pRecursos->getEscenario();
	
	m_iVistaIzq=0;
	m_iVistaDer=m_pEscenario->m_uiLargo;
}

/*------------------------------------------------------------------------------
	Frees memory
------------------------------------------------------------------------------*/
void CEscenario::Liberar()
{
	m_pRecursos=NULL;
	m_pEscenario=NULL;
	printf( "- Escenario Liberado\n");	
}

/*------------------------------------------------------------------------------
	Draws a tile
------------------------------------------------------------------------------*/
void CEscenario::DibujarTile(int iTextura)
{   
    if(m_bTransparente)
	{
		glEnable(GL_BLEND);
		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	}
	else
	{
		glEnable(GL_ALPHA_TEST);
		glAlphaFunc(GL_GREATER, 0.1f); 
	}
    
    if(m_pRecursos)
    	m_pRecursos->getTexturaEscenario(iTextura)->Bind();

    glBegin( GL_TRIANGLES );
      glTexCoord2f( 0.01f,  0.99f ); glVertex3f( -(LARGO_BLOQUE/2), -(LARGO_BLOQUE/2),  0.0f );
      glTexCoord2f( 0.99f,  0.99f ); glVertex3f(  (LARGO_BLOQUE/2), -(LARGO_BLOQUE/2),  0.0f );
      glTexCoord2f( 0.99f,  0.01f ); glVertex3f(  (LARGO_BLOQUE/2),  (LARGO_BLOQUE/2),  0.0f );
      
      glTexCoord2f( 0.01f,  0.99f ); glVertex3f( -(LARGO_BLOQUE/2), -(LARGO_BLOQUE/2),  0.0f );
      glTexCoord2f( 0.99f,  0.01f ); glVertex3f(  (LARGO_BLOQUE/2),  (LARGO_BLOQUE/2),  0.0f );
      glTexCoord2f( 0.01f,  0.01f ); glVertex3f( -(LARGO_BLOQUE/2),  (LARGO_BLOQUE/2),  0.0f );     
    glEnd();   	       	       


    glDisable( GL_BLEND ); 

}

/*------------------------------------------------------------------------------
	Transform X screen coord to cells coord
------------------------------------------------------------------------------*/
int CEscenario::f2celdaX(float f)
{
	return (int((f/LARGO_BLOQUE)));	
}

/*------------------------------------------------------------------------------
	Transform X cell coord to screen coord
------------------------------------------------------------------------------*/
float CEscenario::celda2fX(int celda)
{
	return (float((celda*LARGO_BLOQUE)));
}
/*------------------------------------------------------------------------------
	Transform Y screen coord to cells coord
------------------------------------------------------------------------------*/
int CEscenario::f2celdaY(float f)
{	
	int result;
	result=(int((f/LARGO_BLOQUE)-9.5));
	
	if(result<0)result=-result;
	
	return result;
	
}

/*------------------------------------------------------------------------------
	Transform Y cell coord to screen coord
------------------------------------------------------------------------------*/
float CEscenario::celda2fY(int celda)
{
	return (float((9.5-celda)*0.1));
}

/*------------------------------------------------------------------------------
	Draws level
------------------------------------------------------------------------------*/
void CEscenario::Dibujar()
{
	int i,j;
		
	glPushMatrix();
	
	glColor3f(m_aColor[0],m_aColor[1],m_aColor[2]);
    for(i=0;i<m_pEscenario->m_uiAlto;i++)
    {
      	for (j=m_iVistaIzq;j<m_iVistaDer;j++)    	
    	{    		
    		if (m_pEscenario->m_aBloques[i][j]>-1)
    		{
				glLoadIdentity();
				glTranslatef(celda2fX(j)+(LARGO_BLOQUE/2),celda2fY(i),0);	
				DibujarTile(m_pEscenario->m_aBloques[i][j]);				
			}
		}   		
	}   
	
	glColor3f(1,1,1);
	glPopMatrix();
}

/*------------------------------------------------------------------------------
	Returns cell value
------------------------------------------------------------------------------*/
int CEscenario::getCelda(int x,int y)
{
//	if(y<m_pEscenario->m_uiLargo && x<m_pEscenario->m_uiAlto)
	return m_pEscenario->m_aBloques[x][y];	
}

/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
void CEscenario::setX(float x)	
{
	m_fX=x;
	
	if(f2celdaX(getX()+1)<m_pEscenario->m_uiLargo)
	{
		m_iVistaIzq=f2celdaX(getX()-1);
		m_iVistaDer=f2celdaX(getX()+1.1);
	}
}

/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
void CEscenario::setY(float y)	
{
	m_fY=y;
}

/*------------------------------------------------------------------------------
	If X,Y cell is a floor, returns TRUE
------------------------------------------------------------------------------*/
Bool CEscenario::EsSuelo(int x,int y)
{
	Bool fin=FALSE;
	int iY=y;
	while(!fin)
	{
		if(getCelda(iY,x)!=-1)		
			iY++;
		else
			return FALSE;
			
		if(iY>MAX_ALTURA_BLOQUES)
			fin=TRUE;
	}
	return TRUE;
}
